package com.clear.proxy.dynamicProxy.cglib;

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;

public class CacheMethodInterceptor implements MethodInterceptor {

    private HashMap<String,String> cache = new LinkedHashMap<>(256);

    private DatabaseDataQuery databaseDataQuery;    // 组合需要被代理的对象

    public CacheMethodInterceptor() {
        this.databaseDataQuery = new DatabaseDataQuery();
    }
    /**
     *
     * @param obj "this" 增强的对象
     * @param method 拦截的方法
     * @param args 方法的参数
     * @param proxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // 1、判断是哪一个方法
        String result = null;
        // todo 这里匹配想要被代理发方法，并做功能增强
        if ("query".equals(method.getName())) {
            // 2.查缓存，命中直接返回
            result = cache.get(args[0].toString());
            if (result != null) {
                System.out.println("命中！走缓存");
                return result;
            }
            // 3.未命中，查询数据库，将查询结果存入缓存，再次查询时走缓存
            System.out.println("未命中！");
            result = (String) method.invoke(databaseDataQuery, args);
            // 如果查到了，缓存
            cache.put(args[0].toString(),result);
            return result;
        }

        // 当其他的方法被调用，不希望被干预（不希望被代理），直接调用原生的方法
        return method.invoke(databaseDataQuery,args);
    }
}
